package forza4;

import forza4.Impostazioni.Cella;
import forza4.Impostazioni.Pedina;

public class Board {
	private Cella[][] stato;
	
	public Board(){
		stato = new Cella[6][7];
		for(int i=0;i<6;i++)
			for(int j=0;j<7;j++)
				stato[i][j]=Cella.VUOTA;
	}
	
	public int aggiungiPedina(int colonna,Giocatore giocatore)
	{
		int rigaInserimento;
		rigaInserimento = aggiungiColonna(colonna,giocatore.getPedina());
		return rigaInserimento;
	}
	
	private int aggiungiColonna(int colonna,Pedina pedina)
	{
		int ultimaPosizione=0;
		while(ultimaPosizione<6&&(stato[ultimaPosizione][colonna]!=Cella.VUOTA))
			ultimaPosizione++;
		if (ultimaPosizione<=5){
			if (pedina==Pedina.GIALLO)
				stato[ultimaPosizione][colonna]=Cella.GIALLO;
			else stato[ultimaPosizione][colonna]=Cella.ROSSO;
				return ultimaPosizione;
			}
		else
			return -1;
	}
	
	public int getNumeroGettoni()
	{
		int pedine=0;
		for(int i=0;i<6;i++)
			for(int j=0;j<7;j++)
				if ((stato[i][j]==Cella.ROSSO)||(stato[i][j]==Cella.GIALLO))
						pedine++;
		return pedine;
	}
    
	public String boardToProlog()
	{
		String lista = new String();
		lista="[";
		for(int i=0;i<6;i++)
			for(int j=0;j<7;j++)
				if (stato[i][j]==Cella.ROSSO)
					lista=lista+"cella("+(j+1)+","+(i+1)+",r),";
				else
					if (stato[i][j]==Cella.GIALLO)
						lista=lista+"cella("+(j+1)+","+(i+1)+",g),";
		lista=lista+"]";
		lista=lista.replaceAll(",]", "]");
		return lista;
	}
	
	public boolean controlloVittoria(Quattro quattro){
		quattro.setGettone(Cella.ROSSO);
		if (controlloVittoriaColore(quattro))
			return true;
		quattro.setGettone(Cella.GIALLO);
		if (controlloVittoriaColore(quattro))
			return true;
		return false;
	}
		
	public boolean controlloVittoriaColore(Quattro quattro){	
		int i,j;
		int r1,r2,r3,r4,c1,c2,c3,c4;
		Cella verifica = quattro.getGettone();
		for (i=0;i<6;i++)
		{
			j=0;
			while (j<4)
			{
				if (stato[i][j]==verifica)
				{
					r1=j;
					c1=i;
					j++;
					if (stato[i][j]==verifica)
					{
						r2=j;
						c2=i;
						j++;
						if (stato[i][j]==verifica)
						{
							r3=j;
							c3=i;
							j++;
							if (stato[i][j]==verifica)
							{
								r4=j;
								c4=i;
								quattro.init(verifica, r1, r2, r3, r4, c1, c2, c3, c4);
								return true;
							}
						}
					}
				}
				j++;
			}
		}
		for (j=0;j<7;j++)
			{
				i=0;
				while (i<3)
				{
					if (stato[i][j]==verifica)
					{
						r1=j;
						c1=i;
						i++;
						if (stato[i][j]==verifica)
						{
							r2=j;
							c2=i;
							i++;
							if (stato[i][j]==verifica)
							{
								r3=j;
								c3=i;
								i++;
								if (stato[i][j]==verifica)
								{
									r4=j;
									c4=i;
									quattro.init(verifica, r1, r2, r3, r4, c1, c2, c3, c4);
									return true;
								}
							}
						}
					}				
					i++;
				}
			}
		for (j=0;j<4;j++)
			for (i=0;i<3;i++)
				{
				    int j1=j,i1=i;
					if (stato[i1][j1]==verifica)
					{
						r1=j1;
						c1=i1;
						i1++;
						j1++;
						if (stato[i1][j1]==verifica)
						{
							r2=j1;
							c2=i1;
							i1++;
							j1++;
							if (stato[i1][j1]==verifica)
							{
								r3=j1;
								c3=i1;
								i1++;
								j1++;
								if (stato[i1][j1]==verifica)
								{
									r4=j1;
									c4=i1;
									quattro.init(verifica, r1, r2, r3, r4, c1, c2, c3, c4);
									return true;
								}
							}
						}
				}
			}
		for (j=0;j<4;j++)
			for (i=3;i<6;i++)
				{
					int i1=i,j1=j;
					if (stato[i1][j1]==verifica)
					{
						r1=j1;
						c1=i1;
						i1--;
						j1++;
						if (stato[i1][j1]==verifica)
						{
							r2=j1;
							c2=i1;
							i1--;
							j1++;
							if (stato[i1][j1]==verifica)
							{
								r3=j1;
								c3=i1;
								i1--;
								j1++;
								if (stato[i1][j1]==verifica)
								{
									r4=j1;
									c4=i1;
									quattro.init(verifica, r1, r2, r3, r4, c1, c2, c3, c4);
									return true;
								}
							}
						}
				}
			}
		return false;
	}
}
